/**
 * 基于Promise二次封装axios
 */
import qs from 'qs'
import axios from 'axios'
import {ElLoading, ElNotification} from 'element-plus'


let loading: {
  close(): void
}

// 异常拦截处理器
const errorHandler = (error: any) => {
  loading.close()
  console.log(`err${error}`)
  ElNotification({
    title: '请求失败',
    message: error.message,
    type: 'error'
  })
  // // 需要重定向到错误页面
  // const errorInfo = error.response
  // if (errorInfo) {
  //   error = errorInfo.data  // 页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
  //   const errorStatus = errorInfo.status; // 404 403 500 ...
  //   router.push({
  //     path: `/error/${errorStatus}`
  //   })
  // }
  return Promise.reject(error)
}

// // 全局配置
// 测试环境，使用mokjs时，不用指定baseURL的值，使用默认就行
// // 根据环境变量区分接口默认地址（前缀）
// switch (process.env.NODE_ENV) {
// case 'test':
//   axios.defaults.baseURL = constant.test_baseUrl
//   break
// case 'prod':
//   axios.defaults.baseURL = constant.prod_baseUrl
//   break
// default:// dev
//   axios.defaults.baseURL = constant.dev_baseUrl
// }

// 请求超时时间
axios.defaults.timeout = 60000

// CROS跨域是否允许凭证
axios.defaults.withCredentials = true

// 请求拦截器：axios前置拦截
// 通过axios请求拦截器添加token，保证拥有获取数据的权限
axios.interceptors.request.use(config => { // config指请求对象
  loading = ElLoading.service({
    lock: true,
    text: 'Loading',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.4)'
  })
  const token = window.localStorage.getItem('token')
  if (token !== null) {
    config.headers.Authorization = token
  }
  return config
}, errorHandler)

//   // 自定义响应成功的HTTP状态码（一般情况下用配置）
// // 设置什么才算成功，什么时候才算失败
// axios.defaults.validateStatus = status => {
//   // 默认大于等200小于300的才算成功
//   return /^(2|3)\d{2}$/.test(status) //设置2和3开头的都算成功
// }

// 响应拦截器：axios后置拦截
axios.interceptors.response.use(res => {
  loading.close()
  // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
  if (res.status === 200) {
    return Promise.resolve(res)
  } else { // 否则的话抛出错误
    return Promise.reject(res)
  }
}, errorHandler)

/**
 * Get请求
 * @param url 请求地址
 * @param params 参数
 * @returns {Promise<unknown>}
 */
export function get(url: string, params: any = {}): Promise<any> {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(res => {
      resolve(res.data)
    }).catch(error => {
      reject(error.data)
    })
  })
}

// 设置POST请求头，告诉服务器请求主体的数据格式：a=aaaa&b=bbbb
// 需要导入 import qs from 'qs'
/**
 * Post请求
 * @param url 请求地址
 * @param params 参数
 * @returns {Promise<unknown>}
 */
export function post(url: string, params: any = {}): Promise<any> {
  return new Promise((resolve, reject) => {
    axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8' // 默认
    axios.post(url, qs.stringify(params))
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

// axios.post默认情况下传递到后台的数据是JSON格式的
export function postJson(url: string, params: any = {}): Promise<any> {
  return new Promise((resolve, reject) => {
    axios.defaults.headers['Content-Type'] = 'Content-Type: application/json;charset=UTF-8'
    axios.post(url, params)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

/*
 *  文件上传
 *  url:请求地址
 *  params:参数
 * */
export function fileUpload(url: string, params: any = {}): any {
  return new Promise((resolve, reject) => {
    axios({
      url: url,
      method: 'post',
      data: params,
      headers: {'Content-Type': 'multipart/form-data'}
    })
      .then(res => {
        resolve(res)
      })
      .catch(error => {
        reject(error)
      })
  })
}
